package util

import (
	"crypto/sha512"
	"github.com/anaskhan96/go-password-encoder" // 引入 go-password-encoder 库，用于密码加密和验证
	"strings"                                   // 引入字符串处理库
)

// 定义密码加密参数变量
var pwdOptions *password.Options

/* `base_init` 函数会在程序启动时自动执行，初始化密码加密参数 */
func init() {
	pwdOptions = &password.Options{
		SaltLen:      16,         // 生成的盐值长度为 16 字节
		Iterations:   100,        // 进行 100 次哈希迭代
		KeyLen:       32,         // 生成的密钥长度为 32 字节
		HashFunction: sha512.New, // 使用 SHA-512 作为哈希算法
	}
}

/*
CheckPassword 用于验证用户输入的明文密码是否与数据库存储的加密密码匹配
rawPwd：用户输入的明文密码
dbPwd：数据库中存储的加密密码
返回值：如果密码匹配，返回 true，否则返回 false
*/
func CheckPassword(rawPwd string, dbPwd string) bool {
	// 解析数据库中存储的加密密码，分割成 3 部分：算法标识、盐值、加密后的密码
	parseDbPwd := strings.Split(dbPwd, "$") //Split转换成切片
	// 使用 go-password-encoder 提供的 `Verify` 方法验证密码是否匹配
	return password.Verify(rawPwd, parseDbPwd[2], parseDbPwd[3], pwdOptions)
}

/*
EncodePassword 用于对明文密码进行加密
rawPwd：需要加密的明文密码
返回值：加密后的密码，格式为 "$pbkdf2-sha512$盐值$加密后密码"
*/
func EncodePassword(rawPwd string) string {
	// 生成随机盐值，并使用 PBKDF2-SHA512 进行密码加密
	salt, encodedPwd := password.Encode(rawPwd, pwdOptions)
	// 按照格式拼接加密后的密码，包含加密方式、盐值、加密后的密码
	newPassword := "$pbkdf2-sha512$" + salt + "$" + encodedPwd
	return newPassword
}
